﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Data;
using System.Net;
using System.IO;

namespace PharmClientService
{
    class ParsingSites
    {
        private Cookie[] _cook;

        public DataTable SitePars(string site, string param, int siteid, string drugname, string cityname)
        {
            DataTable dt = new DataTable();
            string[] str;
            try
            {
                switch (siteid)
                {
                    case 1://http://www.poisklekarstv.ru
                        str = Regex.Split(GET(site, param, Encoding.Default), "}");
                        string tmpstr = "";
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("количество");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");
                        foreach (string s in str)
                        {
                            if (s.IndexOf("\"l_name\":") > -1)
                            {
                                tmpstr = s.Replace(s.Substring(0, s.IndexOf("\"l_name\":") + 10), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"manuf\":"), tmpstr.IndexOf("\"date_report\":") + 14 - tmpstr.IndexOf("\"manuf\":")), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"price\":"), 8), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"qty\":"), 6), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"city\":"), 7), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"a_name\":")), tmpstr.Substring(tmpstr.IndexOf("\"a_name\":")).Replace("(", "\",\"").Replace(")", ""));
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"price_inc_company\":"), tmpstr.IndexOf("\"a_name\":") + 9 - tmpstr.IndexOf("\"price_inc_company\":")), "");
                                if (tmpstr.IndexOf(",\"<img") > -1) tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf(",\"<img"), tmpstr.IndexOf(">\",") + 2 - tmpstr.IndexOf(",\"<img")), ",\"0\"");
                                tmpstr = tmpstr.Replace("\",\"", "\t").Trim().TrimEnd('"');
                                tmpstr = tmpstr.Replace(@"&quot;", "\"");
                                string[] rowsstr = Regex.Split(tmpstr, "\t");
                                string[] rowsstr_short = new string[7];
                                for (int i = 0; i < 7; i++)
                                {
                                    rowsstr_short[i] = rowsstr[i];
                                }
                                dt.Rows.Add(rowsstr_short);
                            }
                        }
                        dt.Columns.Remove("количество");
                        dt.Columns.Add("ИД сайта");

                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["ИД сайта"] = siteid;
                        }
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    case 2://http://lek.nsk.ru
                        string str1 = GET(site, param, Encoding.UTF8);
                        if (str1.IndexOf("Цену уточните в аптеке") > -1)
                        {
                            str1 = str1.Substring(str1.IndexOf("Цену уточните в аптеке"), str1.Length - 1 - str1.IndexOf("Цену уточните в аптеке"));
                            str1 = str1.Replace("\t", "");
                            str1 = str1.Replace("Уточнить <br/>в аптеке", "0");
                            if (str1.IndexOf("<tbody>") > -1) str1 = str1.Substring(str1.IndexOf("<tbody>") + 7, str1.IndexOf("</tbody>") - str1.IndexOf("<tbody>") - 8);
                            str1 = str1.Replace("\n", "");
                            str1 = str1.Replace("</tr>", "</tr>\n");
                            str = Regex.Split(str1, "\n");
                            dt.Columns.Add("Аптека");
                            dt.Columns.Add("Адрес");
                            dt.Columns.Add("район");
                            dt.Columns.Add("телефон");
                            dt.Columns.Add("Дата");
                            dt.Columns.Add("Цена");
                            foreach (string s in str)
                            {
                                str1 = s;
                                while (str1.IndexOf("<") > -1)
                                {
                                    str1 = str1.Replace(str1.Substring(str1.IndexOf("<"), str1.IndexOf(">") - str1.IndexOf("<") + 1), "||||").Replace("||||||||", "||||").Trim('|').Trim().Replace("||||", "\t");
                                }
                                while (str1.IndexOf("\t\t") > -1)
                                {
                                    str1 = str1.Replace("\t\t", "\t");
                                }
                                try
                                {
                                    if (str1.Length > 0 && str1.IndexOf("var") == -1)
                                        if (str1.Substring(str1.Length - 2) != " 0")
                                            dt.Rows.Add(Regex.Split(str1, "\t"));
                                }
                                catch (Exception)
                                {
                                    //MessageBox.Show(ex.Message + "\n" + str1);
                                }
                            }
                            dt.Columns.Add("Товар");
                            dt.Columns.Add("Город");
                            dt.Columns.Add("ИД сайта");

                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                dt.Rows[i]["Товар"] = drugname;
                                dt.Rows[i]["Город"] = "Новосибирск";
                                dt.Rows[i]["Адрес"] = "р-н " + dt.Rows[i]["район"].ToString() + ", " + dt.Rows[i]["Адрес"].ToString() + ", тел. " + dt.Rows[i]["телефон"].ToString();
                                dt.Rows[i]["ИД сайта"] = siteid;
                            }

                            dt.Columns.Remove("телефон");
                            dt.Columns.Remove("район");
                            dt.Columns["Товар"].SetOrdinal(0);
                            dt.Columns["Дата"].SetOrdinal(1);
                            dt.Columns["Цена"].SetOrdinal(2);
                            dt.Columns["Город"].SetOrdinal(3);
                            dt.Columns["Аптека"].SetOrdinal(4);
                            dt.Columns["Адрес"].SetOrdinal(5);
                            dt.Columns["ИД сайта"].SetOrdinal(6);
                        }
                        break;
                    case 3://http://www.009.am
                        string sitestr = "";

                        sitestr = GET_HTTP(site, param, Encoding.UTF8, _cook, out _cook);

                        if (sitestr.IndexOf("Вы можете купить лекарства под заказ") > -1 && sitestr.IndexOf("<!-- конец последнего района") > -1) sitestr = sitestr.Substring(sitestr.IndexOf("Вы можете купить лекарства под заказ"), sitestr.IndexOf("<!-- конец последнего района") - sitestr.IndexOf("Вы можете купить лекарства под заказ"));
                        else
                        {
                            dt = new DataTable();
                            break;
                        }
                        if (sitestr.IndexOf("<div class=\"search_row") > -1) sitestr = sitestr.Substring(sitestr.IndexOf("<div class=\"search_row"));
                        while (sitestr.IndexOf("<div class=\"rayoncapt\">") > -1)
                        {
                            int i = sitestr.IndexOf("<div class=\"rayoncapt\">");
                            sitestr = sitestr.Replace(sitestr.Substring(i, sitestr.IndexOf("<div class=\"search_row", i) - i), "");
                        }
                        sitestr = sitestr.Replace("отложить", "");
                        while (sitestr.IndexOf(">") > -1 && sitestr.IndexOf("<") > -1)//
                        {
                            if (sitestr.IndexOf(">") - sitestr.IndexOf("<") > 0)
                                sitestr = sitestr.Replace(sitestr.Substring(sitestr.IndexOf("<"), sitestr.IndexOf(">") - sitestr.IndexOf("<") + 1), "||||").Replace("\t", "").Replace("\n", "");
                        }
                        sitestr = sitestr.Replace("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", "\n");
                        while (sitestr.IndexOf("||") > -1)
                            sitestr = sitestr.Replace("||", "|");
                        str = Regex.Split(sitestr, "\n");
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("производитель");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");
                        dt.Columns.Add("Цена");
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');
                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");
                            int i = 0;
                            for (int j = 0; j < 4; j++) i = s.IndexOf('|', i + 1);
                            s = s.Substring(i + 1);
                            s = s.Replace("|", "\t");
                            try
                            {
                                dt.Rows.Add(Regex.Split(s, "\t"));
                            }
                            catch (Exception)
                            {
                                //MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                            }
                        }
                        dt.Columns.Remove("производитель");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("ИД сайта");
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["Город"] = cityname;
                            dt.Rows[i]["Дата"] = DateTime.Today.ToString("yyyy-MM-dd");
                            dt.Rows[i]["ИД сайта"] = siteid;
                        }

                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);
                        break;
                    default:
                        //MessageBox.Show("Не определен ID сайта");
                        break;
                }
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
            }
            return dt;
        }


        private static string GET(string Url, string Data, Encoding en)
        {
            WebRequest req = WebRequest.Create(Url + "?" + Data);
            WebResponse resp = req.GetResponse();
            req.Timeout = 10000;
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream, en);
            string Out = sr.ReadToEnd();
            sr.Close();
            req = null;
            return Out;
        }

        private static string GET_HTTP(string Url, string Data, Encoding en, Cookie[] incook, out Cookie[] outcook)
        {
            string Out = "";
            try
            {
                HttpWebRequest req1 = (HttpWebRequest)WebRequest.Create(Url + "?" + Data);
                req1.CookieContainer = new CookieContainer();

                ////получаем куки
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url + "?" + Data);
                req.CookieContainer = new CookieContainer();
                req.Timeout = 5000;
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream responseStream = resp.GetResponseStream();
                incook = new Cookie[0];
                foreach (Cookie c in resp.Cookies)
                {
                    req1.CookieContainer.Add(new Uri(Url), c);
                    Array.Resize(ref incook, incook.Length + 1);
                    incook[incook.Length - 1] = c;
                }
                responseStream.Close();
                req = null;
                ////////////////////

                WebResponse resp1 = req1.GetResponse();
                req1.Timeout = 30000;
                Stream stream = resp1.GetResponseStream();
                StreamReader sr = new StreamReader(stream, en);
                Out = sr.ReadToEnd();
                sr.Close();

                outcook = incook;
            }
            catch (Exception)
            {
                Out = "";
                outcook = incook;
            }
            return Out;
        }
    }
}
